#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<iostream>
#include<unistd.h>
#include<vector>
#include<pthread.h>
using namespace std;
#define N 5
pthread_mutex_t glock=PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t gcond=PTHREAD_COND_INITIALIZER;
 int cnt;
void * routine(void *arg){
   char *name=static_cast<char*>(arg);
   while(1){
   pthread_mutex_lock(&glock);
   pthread_cond_wait(&gcond,&glock);//如果所有线程都进去了；如果也没有唤醒；
   //那么就相当于阻塞住。

   //先把所有线程放入等待队列： 0 1 2 3 4;从头开始取；尾部插入；
   //因此可以看到取出的线程直接就拿到锁了；
   //本质是还和其他等待锁的线程竞争；但是无其他线程了
       cout<<name<<" accumulate cnt before:"<<cnt++
       <<" accumulate cnt after:"<<cnt<<endl;
   pthread_mutex_unlock(&glock);

   }
 return nullptr;

}
int w=0;
void* r(void*arg){
  string name=static_cast<const char*>(arg);
  while(1){
  pthread_mutex_lock(&glock);
    cout<<name<<endl;
    sleep(1);
    if(w==0){
        w++;
        pthread_cond_wait(&gcond,&glock);   
        w--;
       cout<<name<<endl;

    }
  pthread_cond_signal(&gcond);
   pthread_mutex_unlock(&glock);
   sleep(1);

  }

 return nullptr;
}
int main(){

     //俩线程轮流打印：
        pthread_t t1,t2;

       pthread_create(&t1,nullptr,r,(void*)"我是线程A");
        pthread_create(&t2,nullptr,r,(void*)"我是线程B");     
          pthread_join(t1,nullptr);
       pthread_join(t2,nullptr);

      
//     vector<pthread_t> v;
//     for(int i=0;i<N;i++){
//         pthread_t tid;
//         //堆：
//         char *buff =new char[100];
//         sprintf(buff,"thread-%d",i);
//         pthread_create(&tid,nullptr,routine,buff);
//         v.emplace_back(tid);
//     }
// //主线程对它们唤醒：
//     while(1){
//         sleep(1);
//         cout<<"唤醒gcond下等待的线程 "<<endl;
//         pthread_cond_signal(&gcond);
//     }
//     for(int i=0;i<v.size();i++){
//      void *ret=nullptr;
//         pthread_join(v[i],&ret);
//     }

}